home *** CD-ROM | disk | FTP | other *** search
- (* Divide an integer by a natural number, using operations of
- addition, subtraction , doubling and halving only. Repeat
- reading pairs of integers, until you encounter a 0. For each pair,
- print dividend, divisor, quotient, and remainder. Indicate
- invariant of loop.*)
-
- MODULE divide;
- FROM Terminal IMPORT WriteString, WriteLn;
- FROM InOut IMPORT ReadInt,WriteInt;
-
- VAR a,b,q,r:INTEGER;
-
- PROCEDURE divide(x,y: INTEGER; VAR z,a:INTEGER);
- VAR q,r,w: INTEGER;
-
- BEGIN
- r := x; w := y; q := 0;
- WHILE w <= r DO w := 2*w END;
- WHILE w # y DO
- w := w DIV 2;
- q := 2*q;
- IF w <= r THEN
- r := r-w; INC(q);
- END
- END;
- z := q; a := r;
- END divide;
-
- BEGIN
- WriteString('Enter dividend> ');
- ReadInt(a);
- WHILE a # 0 DO
- WriteString('Enter divisor> ');
- ReadInt(b);
- divide(a,b,q,r);
- WriteInt(a,3); WriteInt(b,3);
- WriteInt(q,3); WriteInt(r,3);
- WriteLn;
- WriteString('Enter dividend> ');
- ReadInt(a);
- END
- END divide.
-